package com.sxj.corejava.code14_Lambda表达式;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author 石小俊
 */
public class Test06_方法引用 {

    public static void main(String[] args) {
        Consumer<String> c = s -> System.out.println(s);
        c.accept("Hello Consumer");
        // 对象::实例方法名
        // 可以通过方法引用实现上面的代码
        Consumer<String> c2 = System.out::println;
        c2.accept("Hello Consumer2");

        User user = new User();
        // 对于有参无返回值的方法,都可以通过Consumer接收
        Consumer<Integer> c3 = user::setId;
        Consumer<String> c4 = user::setUsername;
        c3.accept(1);
        c4.accept("admin");
//        System.out.println(user);
//        System.out.println(user.getId());
//        System.out.println(user.getUsername());

        Supplier<Integer> s = user::getId;
        Supplier<String> s2 = user::getUsername;
        System.out.println(s.get());
        System.out.println(s2.get());

        // 类::静态方法
        User.sayHello();
        Supplier<String> s3 = User::sayHello;
        System.out.println(s3.get());

        String str = new String("aa");
        Predicate<String> p = str::equals;
        System.out.println(p.test("aa"));
        // 上述过程相当于一个对象调用了方法,而并不是两个参数的比较
        // 如果想要两个参数的比较,可以使用BiPredicate<T,R>
        // 此时的equals方法是一个实例方法
        // 但是,在这种场景下,只能通过类名::实例方法名调用
        BiPredicate<String,String> bp = String::equals;
        System.out.println(bp.test("a","a"));



    }

}
